home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / gcc / newgccstart.lha / source.lha / startup / startup.s < prev   
Encoding:
Text File  |  1994-03-14  |  2.4 KB  |  101 lines

  1. #if !defined(CRT0) && !defined(BCRT0) && !defined(RCRT0)
  2. #define CRT0
  3. #endif
  4. #ifdef CRT0
  5. | normal (large data model) startup code
  6. #endif
  7. #ifdef BCRT0
  8. | base relative (short data model) startup code
  9. #endif
  10. #ifdef RCRT0
  11. | resident (short data model) startup code
  12. #endif
  13.   .text
  14.   .even
  15.   .globl ___amain
  16.   .globl ___aexit
  17. #ifndef RCRT0
  18.   .globl _geta4
  19. #endif
  20.  
  21.   moveml #0x7ffe,sp@-        | push registers
  22. #ifdef BCRT0
  23.   lea     ___a4_init,a4        | set global data segment pointer
  24. #endif
  25. #ifdef RCRT0
  26.   movel  4,a6            | get SysBase           ->a6
  27.   movel  a0,a2            | store argument       ->a2
  28.   movel  #___data_size,d2    |
  29.   addl     #___bss_size,d2    | global data segment size ->d2
  30.   movel  d2,d0            | size
  31.   moveql #0,d1            | MEMF_ANY
  32.   jsr     a6@(-198)              | AllocMem
  33.   movel  d0,a4            | new global data segment  ->a4
  34.   jne     gotit            | yes ?
  35.   moveql #20,d0         | oh, dear
  36.   jra     error            |
  37. gotit:                |
  38.   lea     ___a4_init,a3        | old global data segment pointer
  39.   subw     #32766,a3        | old global data segment  ->a3
  40.   movel  d2,d0            | size
  41.   movel  a3,a0            | old
  42.   movel  a4,a1            | new
  43.   jsr     a6@(-624)              | CopyMem
  44.   movel  a3,d0            |
  45.   subl     a4,d0            | old-new           ->d0
  46.   movel  #___datadata_relocs,a0 | pointer relocation table ->a0
  47.   movel  a0@+,d1        | number of pointers       ->d1
  48.   jeq     loopend        | none ?
  49. loop:                |
  50.   movel  a0@+,a1        | get offset of next pointer
  51.   subl     d0,a1@(a4:l)           | and fix it
  52.   subql  #1,d1            |
  53.   jne     loop            | ready ?
  54. loopend:            |
  55.   movel  a4,sp@-        | push memory address
  56.   movel  d2,sp@-        | and size
  57.   addw     #32766,a4        | get new global data segment pointer
  58.   movel  a2,a0            | remember argument
  59. #endif
  60. #ifdef CRT0
  61.   movel  a7,stackpointer    | store stackpointer
  62. #else
  63.   movel  a7,a4@(-32766:w)       | store stackpointer
  64. #endif
  65.   movel  a0,sp@-        | push Argument
  66.   jsr     ___amain        | call __amain(), does not return
  67. ___aexit:
  68. #ifdef RCRT0
  69.   movel  sp@(4),d2              | remember returncode
  70. #else
  71.   movel  sp@(4),d0              | get returncode
  72. #endif
  73. #ifdef CRT0
  74.   movel  stackpointer,a7    | set stackpointer
  75. #else
  76.   movel  a4@(-32766:w),a7       | set stackpointer
  77. #endif
  78. #ifdef RCRT0
  79.   movel  4,a6            | get SysBase
  80.   movel  sp@+,d0        | pop memory size
  81.   movel  sp@+,a1        | and address
  82.   jsr     a6@(-210)              | FreeMem()
  83.   movel  d2,d0            | get returncode
  84. error:                |
  85. #endif
  86.   moveml sp@+,#0x7ffe        | pop registers
  87. #ifdef CRT0
  88. _geta4:             |
  89. #endif
  90.   rts                |
  91. #ifdef BCRT0
  92. _geta4:             | Set global-data segment pointer
  93.   lea     ___a4_init,a4        |
  94.   rts                |
  95. #endif
  96.  
  97.   .data
  98.   .even
  99. stackpointer:
  100.   .long  0
  101.